#ifndef FILEINFOREPOSITORY_H
#define FILEINFOREPOSITORY_H

#include <QObject>
#include <QList>
#include <QHash>
#include <QString>
#include <QDebug>
#include "unifiedfileinfo.h"
#include "filelistindex.h"

/**
 * FileInfoRepository - Single Source of Truth for File Information
 *
 * Martin Fowler 重构模式：Repository Pattern + Single Source of Truth
 *
 * 解决的问题：
 * - 数据源分散导致的不一致性
 * - 文件信息在多个类中重复存储
 * - 数据同步复杂且容易出错
 *
 * 设计原则：
 * - 所有文件信息只在这里存储和管理
 * - 其他类只通过这个仓库访问文件信息
 * - 提供类型安全的索引操作
 * - 确保数据一致性和完整性
 * - 使用 UnifiedFileInfo 作为统一数据模型
 */
class FileInfoRepository : public QObject
{
    Q_OBJECT

public:
    explicit FileInfoRepository(QObject* parent = nullptr);
    ~FileInfoRepository() = default;

    // === 核心数据操作 ===
    void addFile(const UnifiedFileInfo& fileInfo);
    void removeFile(const FileListIndex& index);
    void updateFile(const FileListIndex& index, const UnifiedFileInfo& fileInfo);
    void moveFiles(const FileListIndexRange& fromIndices, const FileListIndex& toIndex);
    void clearAll();

    // === 查询接口 ===
    UnifiedFileInfo getFile(const FileListIndex& index) const;
    QList<UnifiedFileInfo> getAllFiles() const;
    FileListIndex getFileCount() const;

    // 按文件名查找（用于映射UI项目）
    FileListIndex findFileByName(const QString& fileName) const;
    FileListIndex findFileByIdentity(const QString& fileIdentity) const;
    QList<FileListIndex> findFilesByNames(const QStringList& fileNames) const;

    // 按文件路径查找
    FileListIndex findFileByPath(const QString& filePath) const;

    // 按状态查找
    QList<FileListIndex> findFilesByStatus(FileStatusIconManager::FileStatus status) const;
    QList<FileListIndex> findFilesByProcessStatus(FileProcessStatus status) const;

    // === 批量操作 ===
    void addFiles(const QList<UnifiedFileInfo>& fileInfos);
    void removeFiles(const QList<FileListIndex>& indices);
    void updateFiles(const QList<QPair<FileListIndex, UnifiedFileInfo>>& updates);

    // === 状态管理 ===
    void setFileStatus(const FileListIndex& index, FileStatusIconManager::FileStatus status);
    void setFileProcessStatus(const FileListIndex& index, FileProcessStatus status);
    void updateFileProgress(const FileListIndex& index, int progress, const QString& statusText);
    void setFileError(const FileListIndex& index, const QString& errorMessage);
    void setFileCompleted(const FileListIndex& index);

    // === 验证和调试 ===
    bool isValidIndex(const FileListIndex& index) const;
    QString getRepositoryState() const; // 调试用，返回当前状态
    bool verifyIntegrity() const;       // 验证数据完整性

    // === 统计信息 ===
    int getTotalPageCount() const;
    qint64 getTotalFileSize() const;
    int getFileCountByType(FileType type) const;
    int getProcessedFileCount() const;
    int getErrorFileCount() const;

    // === 导入导出 ===
    QList<UnifiedFileInfo> exportFiles(const QList<FileListIndex>& indices) const;
    void importFiles(const QList<UnifiedFileInfo>& files, const FileListIndex& insertIndex = FileListIndex(-1));

signals:
    void fileAdded(const FileListIndex& index, const UnifiedFileInfo& fileInfo);
    void fileRemoved(const FileListIndex& index, const UnifiedFileInfo& fileInfo);
    void fileUpdated(const FileListIndex& index, const UnifiedFileInfo& fileInfo);
    void filesReordered(const QList<UnifiedFileInfo>& newOrder);
    void repositoryCleared();
    void fileStatusChanged(const FileListIndex& index, FileStatusIconManager::FileStatus status);
    void fileProgressUpdated(const FileListIndex& index, int progress, const QString& statusText);

private:
    // === 内部数据结构 ===
    struct FileEntry {
        UnifiedFileInfo info;
        QString uniqueId;           // 基于文件路径和名称的唯一标识
        qint64 addedTimestamp;      // 添加时间戳
        int originalOrder;          // 原始添加顺序

        FileEntry() : addedTimestamp(0), originalOrder(-1) {}
        
        explicit FileEntry(const UnifiedFileInfo& fileInfo)
            : info(fileInfo)
            , uniqueId(fileInfo.generateFileIdentity())
            , addedTimestamp(QDateTime::currentMSecsSinceEpoch())
            , originalOrder(-1) {}

        bool operator==(const FileEntry& other) const {
            return uniqueId == other.uniqueId;
        }
    };

    QList<FileEntry> m_files;                    // 主数据存储
    QHash<QString, FileListIndex> m_nameToIndex; // 文件名到索引的映射
    QHash<QString, FileListIndex> m_idToIndex;   // 唯一ID到索引的映射
    QHash<QString, FileListIndex> m_pathToIndex; // 文件路径到索引的映射
    qint64 m_nextTimestamp;                      // 时间戳生成器
    int m_nextOriginalOrder;                     // 顺序生成器

    // === 内部辅助方法 ===
    void rebuildMappings();
    void maintainIntegrity();
    void logRepositoryState() const;
    FileListIndex findNextAvailableIndex() const;
    void updateFileEntry(int listIndex, const UnifiedFileInfo& fileInfo);
    void emitFileUpdated(int listIndex);
};

#endif // FILEINFOREPOSITORY_H